
# 文件流(http下载模块用), 改进的，　支持传输BytesIO对象
class WebFileStream:
    """# 如果需要返回一个文件给前端, 而不想在本地生成一个临时文件, 可以使用这个包装, 使用方法
    bio可以是一个类文件(filelike)对象
    self.send_response_file(filename, WebFileStream(bio))
    """

    def __init__(self, filename):
        if hasattr(filename, 'read'):
            self.file = filename
        elif isinstance(filename, str):
            self.file = open(filename, 'rb')
        else:
            raise TypeError('只能传入一个文件对象或文件名')

    def send(self, buf_size, http_handler):
        while True:
            data = self.file.read(buf_size)
            if not data:
                break
            http_handler.write(data)
        if not self.file.closed:
            self.file.close()
